perm filename PUP[1,DBL]2 blob sn#054585 filedate 1973-07-24 generic text, type T, neo UTF8
(FILECREATED "24-JUL-73 23:12:45" PUP)


  (LISPXPRINT (QUOTE PUPVARS)
              T)
  [RPAQQ PUPVARS
         (NEED REQUIRE $PGM $UNUSEDVARS
               (FNS PURE RAMIFICATIONS OUTTUPLE EXECUTE LISPTRANSLATE 
                    REV2ELS CELLEQUAL LISTEQUAL PULLOUT NUMERORDER 
                    EXTREMORD ORDERING EXTREMEORDERING NEWCDR NEWCAR 
                    NEWCARCDR ASKABOUTALL INVOLVES FLATTEN INSIDEC 
                    SUBLISTC APPENDC REPLACECDR REPLACECAR MAKENULL 
                    RPLAC NEWCELL ALLBUT STORECVALUE CONSC SETQC 
                    TRANSITIVECLOSURE TRYANYTHINGANTISYMPARTIAL 
                    SIMPLEGOAL SOLVE SETUP INIT GETNEWLOCNAME DENYALL 
                    SERIESGOAL ORGOAL ANDGOAL XORGOAL BUILDPGM 
                    GOBYEXAMPLE GETEXAMPLE SAMEASFN DOUBLEFN SYNTH1 
                    SYNTH2 ASKABOUT RHMATCH RECHEAD EXTREMEPOSITION 
                    EXTREMERELATIVEPOSITION POSITIONALJOIN POSITIONAL 
                    RECURLIST)
               (P (QSETUP PUPVARS))
               (P (SETUP)
                  (INIT)
                  (PRINT (QUOTE (READY TO BEGIN PUP]
  (RPAQQ NEED T)
  (RPAQQ REQUIRE T)
  (RPAQQ $PGM (TUPLE))
  (RPAQQ $UNUSEDVARS
         (CLASS U14 U16 U11 U15 U13 U17 U1 U5 U6 U2 U3 U4 U8 U10 U7 U12 
                U9))
(DEFINEQ

(PURE
  [QLAMBDA (TUPLE (TUPLE ←A
                         ←←B)←←C)
           [QIF (QEQUAL $A COMMENT)
             ELSE (PRINT (OUTTUPLE (CDR (TUPLE $A $$B]
           (QIF (QEQUAL $C (TUPLE))
             ELSE (PURE (TUPLE $$C])

(RAMIFICATIONS
  [QLAMBDA
    (TUPLE ←A
           ←B)
    (QPROG (←L
             ←NEXT
             ←S1
             ←S2
             ←S3)
           (QMATCHQ ←L
                    (QINSTANCES ←←ANY))
           B1
           (QATTEMPT (QMATCHQ (CLASS ←NEXT
                                     ←←L)
                              $L)
             ELSE (QRETURN TRUE))
           B2
           [QATTEMPT (QMATCHQ (TUPLE ←←S1
                                     $A ←←S2
                                     $B ←←S3)
                              $NEXT)
               THEN (QPROG NIL (QDELETE (TUPLE $$S1 $A $$S2 $B $$S3))
                           (QASSERT (TUPLE $$S1 $B $$S2 $A $$S3))
                           (GOTO B3))
             ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                            $B ←←S2
                                            $A ←←S3)
                                     $NEXT)
                      THEN (QPROG NIL
                                  (QDELETE (TUPLE $$S1 $B $$S2 $A $$S3))
                                  (QASSERT (TUPLE $$S1 $A $$S2 $B $$S3))
                                  (GOTO B3))
                    ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                                   $A ←←S2)
                                            $NEXT)
                             THEN (QPROG NIL
                                         (QDELETE (TUPLE $$S1 $A $$S2))
                                         (QASSERT (TUPLE $$S1 $B $$S2))
                                         (GOTO B3))
                           ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                                          $B ←←S2)
                                                   $NEXT)
                                    THEN (QPROG NIL
                                                (QDELETE (TUPLE $$S1 $B 
                                                               $$S2))
                                                (QASSERT (TUPLE $$S1 $A 
                                                               $$S2]
           B3
           (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                     (TUPLE ←←NEXT)←←S2)
                              $NEXT)
               THEN (GOTO B2)
             ELSE (GOTO B1])

(OUTTUPLE
  [LAMBDA (S)
    (COND
      ((ATOM S)
        S)
      ((EQUAL (CAR S)
              (QUOTE TUPLE))
        (OUTTUPLE (CDR S)))
      (T (CONS (OUTTUPLE (CAR S))
               (OUTTUPLE (CDR S])

(EXECUTE
  [LAMBDA (I)
    [EVAL (LIST (QUOTE DEFINEQ)
                (LIST $NAME (APPEND (LIST (QUOTE LAMBDA)
                                          (LIST $L)
                                          (LIST (QUOTE SETQ)
                                                (QUOTE EX)
                                                $L))
                                    I]
    (($NAME (EVAL EX])

(LISPTRANSLATE
  [QLAMBDA ←E
           (EVAL (CDR (SASSOC $E
                              (QUOTE (((TUPLE FIRST ELEMENT)
                                       TUPLE CAR $L)
                                      ((TUPLE LAST ELEMENT)
                                       TUPLE LAST $L)
                                      ((TUPLE SECOND ELEMENT)
                                       TUPLE CADR $L)
                                      ((TUPLE ALL BUT THE FIRST ELEMENT)
                                       TUPLE CDR $L)
                                      ((TUPLE ALL BUT THE FIRST TWO 
                                                           ELEMENTS)
                                       TUPLE CDDR $L)
                                      ((TUPLE ALL BUT THE SECOND 
                                              ELEMENT)
                                       TUPLE CONS (TUPLE CAR $L)
                                       (TUPLE CDDR $L))
                                      ((TUPLE ALL BUT THE SINGLETON 
                                              LIST OF THE FIRST ELEMENT)
                                       TUPLE CDR $L)
                                      ((TUPLE ALL BUT THE CLOSEST 
                                              ELEMENT
                                          TO A)
                                       TUPLE PULLOUT
                                       (TUPLE EXTREMORD1 $L $RELNN)
                                       $L)
                                      ((TUPLE ALL BUT THE SMALLEST 
                                              ELEMENT)
                                       TUPLE PULLOUT
                                       (TUPLE EXTREMORD1 $L $RELNN)
                                       $L)
                                      ((TUPLE SMALLEST ELEMENT)
                                       TUPLE EXTREMORD1 $L $RELNN)
                                      ((TUPLE CLOSEST ELEMENT
                                          TO A)
                                       TUPLE EXTREMORD1 $L $RELNN)
                                      ((TUPLE SINGLETON LIST OF THE 
                                              LAST ELEMENT)
                                       TUPLE LIST (TUPLE LAST $L))
                                      ((TUPLE SINGLETON LIST OF THE
                                          FIRST ELEMENT)
                                       TUPLE LIST (TUPLE CAR $L))
                                      ($E. (PRINT (TUPLE COMMENT SORRY 
                                                         I CANNOT 
                                                         TRANSLATE $E])

(REV2ELS
  (QLAMBDA (TUPLE ←RELN
                  ←A
                  ←B)
           (QIF (QAND (QEQUAL (QGET $RELN PARTIAL)
                              TRUE)
                      (QEQUAL (QGET $RELN ANTISYM)
                              TRUE))
             ELSE (QFAIL))
           (QATTEMPT (QEXISTS (TUPLE $RELN $B $A))
             ELSE (TRANSITIVECLOSURE (TUPLE $RELN $B $A)))
           (QEXISTS (TUPLE C $A ←ACON))
           (QEXISTS (TUPLE C $B ←BCON))
           (QGOAL (TUPLE SERIES (TUPLE C $A $BCON)
                         (TUPLE C $B $ACON))
                  APPLY $GOALTYPE)))

(CELLEQUAL
  (QLAMBDA (CLASS ←A
                  ←B)
           (QAND (QATTEMPT (QEXISTS (TUPLE C $A ←VAL1)))
                 (QATTEMPT (QEXISTS (TUPLE C $B ←VAL2)))
                 (QMATCHQ $VAL1 $VAL2))))

(LISTEQUAL
  [QLAMBDA (CLASS ←A
                  ←B)
           (QPROG (←E1
                    ←E2
                    ←E3
                    ←E4)
                  (QATTEMPT (QMATCHQ (TUPLE ←E1
                                            ←←E2)
                                     $A)
                      THEN (QMATCHQ (TUPLE ←E3
                                           ←←E4)
                                    $B)
                    ELSE (QATTEMPT (QMATCHQ (TUPLE ←E3
                                                   ←←E4)
                                            $B)
                             THEN (QRETURN FALSE)
                           ELSE (QRETURN TRUE)))
                  (QIF (QAND (CELLEQUAL (CLASS $E1 $E3))
                             (LISTEQUAL (CLASS $E2 $E4)))
                      THEN (QRETURN TRUE)
                    ELSE (QRETURN FALSE])

(PULLOUT
  [LAMBDA (E L)
    (COND
      ((EQUAL E (CAR L))
        (CDR L))
      (T (CONS (CAR L)
               (PULLOUT E (CDR L])

(NUMERORDER
  [LAMBDA (A B)
    (ALPHORDER A B])

(EXTREMORD
  (QLAMBDA (TUPLE ←L
                  ←RELNN)
           (QATTEMPT (QMATCHQ (TUPLE ←X
                                     ←Y
                                     ←←Z)
                              $L)
               THEN (IF ($RELNN $X $Y)
                        THEN (EXTREMORD (TUPLE (TUPLE $X $$Z)
                                               $RELNN))
                      ELSE (EXTREMORD (TUPLE (TUPLE $Y $$Z)
                                             $RELNN)))
             ELSE (CDR $L))))

(ORDERING
  (QLAMBDA ←L
           (QMATCHQ ←S
                    (TUPLE IDENTITY))
           (QMATCHQ ←E1
                    (TUPLE FIRST ELEMENT))
           (QMATCHQ ←E2
                    (EXTREMEORDERING $RELNN))
           (PRINT (OUTTUPLE (TUPLE
                               IN PARTICULAR THE $$E1 OF THE NEW LIST 
                                  $L IS THE $$E2 OF THE
                               OLD LIST $L)))
           (QMATCHQ ←RECBODY
                    (POSITIONALJOIN (TUPLE $E2 (ALLBUT $E2)
                                           $E1)))
           (PRINT (QUOTE (THIS ENABLED US TO GET THE RECURSIVE BODY)))
           (PRINT $RECBODY)
           (PRINT (QUOTE (WE NOW DETERMINE THE TERMINATION STEPS)))
           (QMATCHQ ←NEWFUNC
                    (RECHEAD $RECBODY))
           [EVAL (PRINT (OUTTUPLE (CDR $NEWFUNC]
           (QMATCHQ ←PGM
                    (TUPLE $NEWFUNC $$PGM))))

(EXTREMEORDERING
  (QLAMBDA ←RELN
           (QGET (TUPLE RELN $RELN)
                 EXTREME)))

(NEWCDR
  [LAMBDA (L)
    (COND
      (L (CDR L))
      (T (RETFROM (QUOTE EXECUTE)
                  (QUOTE ((BREAKING OUT OF NEWCDR])

(NEWCAR
  [LAMBDA (L)
    (COND
      (L (CAR L))
      (T (RETFROM (QUOTE EXECUTE)
                  (QUOTE (BREAKING OUT OF NEWCAR])

(NEWCARCDR
  [LAMBDA (L)
    (COND
      ((NULL L)
        NIL)
      [(EQUAL (CAR L)
              (QUOTE CDDR))
        (CONS (QUOTE NEWCDR)
              (LIST (CONS (QUOTE NEWCDR)
                          (NEWCARCDR (CDR L]
      (T (CONS [COND
                 [(ATOM (CAR L))
                   (COND
                     ((EQUAL (CAR L)
                             (QUOTE CAR))
                       (QUOTE NEWCAR))
                     ((EQUAL (CAR L)
                             (QUOTE CDR))
                       (QUOTE NEWCDR))
                     (T (CAR L]
                 (T (NEWCARCDR (CAR L]
               (NEWCARCDR (CDR L])

(ASKABOUTALL
  (QLAMBDA (CLASS ←A
                  ←←ALLTHEREST)
           (ASKABOUT $A)
           (QATTEMPT (QMATCHQ (CLASS)
                              $ALLTHEREST)
               THEN [QMATCHQ ←AALH
                             (TUPLE (TUPLE COND $$TERM (TUPLE T $BODY]
             ELSE (ASKABOUTALL $ALLTHEREST))))

(INVOLVES
  (QLAMBDA (TUPLE ←T1
                  ←T2)
           (SUBLISTC (FLATTEN $T1)
                     (FLATTEN $T2))))

(FLATTEN
  [LAMBDA (L)
    (COND
      ((ATOM L)
        (LIST L))
      (T (APPEND (FLATTEN (CAR L))
                 (FLATTEN (CDR L])

(INSIDEC
  [LAMBDA (E L)
    (COND
      ((NULL L)
        NIL)
      ((EQUAL E (CAR L))
        T)
      ((AND (LISTP (CAR L))
            (INSIDEC E (CAR L)))
        T)
      (T (INSIDEC E (CDR L])

(SUBLISTC
  [LAMBDA (L1 L2)
    (COND
      ((NULL L1)
        T)
      ((NULL L2)
        NIL)
      ((INSIDEC (CAR L1)
                L2)
        (SUBLISTC (CDR L1)
                  L2])

(APPENDC
  (QLAMBDA (TUPLE ←FRONTLIST
                  ←OLDLIST)
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE JUST TOOK LIST $FRONTLIST
                                    AND APPENDED IT ONTO FRONT OF LIST 
                                        $OLDLIST)
                           (TUPLE SETQ $OLDLIST (TUPLE APPEND 
                                                       $FRONTLIST 
                                                       $OLDLIST))
                           $$PGM))))

(REPLACECDR
  (QLAMBDA (TUPLE LIST ←L
                  ←NEWCDR
                  ←OLDCDR
                  ←CAR)
           (QDELETE (TUPLE LIST $L (TUPLE $CAR $$OLDCDR)))
           (QASSERT (TUPLE LIST $L (TUPLE $CAR $$NEWCDR)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE REPLACE CDR OF LIST $L 
                                  WHICH WAS $OLDCDR BY $NEWCDR)
                           (TUPLE RPLACD $NEWCDR $L)
                           $$PGM))))

(REPLACECAR
  (QLAMBDA (TUPLE LIST ←L
                  ←NEWCAR
                  ←OLDCAR
                  ←CDR)
           (QMATCHQ ←NEWLIST
                    (TUPLE $NEWCAR $$CDR))
           (QMATCHQ ←OLDLIST
                    (TUPLE $OLDCAR $$CDR))
           (QDELETE (TUPLE LIST $L $OLDLIST))
           (QASSERT (TUPLE LIST $L $NEWLIST))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE REPLACE CAR OF LIST $L 
                                  WHICH WAS $OLDCAR
                              BY THE CELL $NEWCAR)
                           (TUPLE RPLACA $NEWCAR $L)
                           $$PGM))))

(MAKENULL
  (QLAMBDA (TUPLE LIST ←L
                  (TUPLE))
           (QATTEMPT (QEXISTS (TUPLE LIST $L ←ANY))
               THEN (QDELETE (TUPLE LIST $L $ANY)))
           (QASSERT (TUPLE LIST $L (TUPLE)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE SET LIST $L TO NULL)
                           (TUPLE SETQ $L NIL)
                           $$PGM))))

(RPLAC
  [QLAMBDA (TUPLE LIST ←L
                  (TUPLE ←CAR
                         ←←CDR))
           (QEXISTS (TUPLE LIST $L (TUPLE ←←CURRENT)))
           (QMATCHQ (TUPLE ←CURCAR
                           ←←CURCDR)
                    $CURRENT)
           (QIF (LISTEQUAL (CLASS $CURCDR $CDR))
               THEN (REPLACECAR (TUPLE LIST $L $CAR $CURCAR $CDR))
             ELSE (QIF (CELLEQUAL (CLASS $CURCAR $CAR))
                      THEN (REPLACECDR (TUPLE LIST $L $CDR $CURCDR $CAR)
                                       )
                    ELSE (QFAIL])

(NEWCELL
  [QLAMBDA (TUPLE ←VAL
                  ←LOC)
           (QPROG (←AUXLOC)
                  (QMATCHQ (CLASS ←AUXLOC
                                  ←←UNUSEDVARS)
                           $UNUSEDVARS)
                  (QASSERT (TUPLE C $AUXLOC $VAL))
                  (QMATCHQ ←PGM
                           (TUPLE (TUPLE COMMENT I MAY NEED $VAL LATER 
                                         SO BEFORE I STORE SOMETHING
                                     IN LOCATION $LOC I AM TRANSFERRING 
                                        $VAL
                                     TO THE NEWLY CREATED LOCATION 
                                        $AUXLOC)
                                  (TUPLE SETQ $AUXLOC $LOC)
                                  $$PGM])

(ALLBUT
  [QLAMBDA ←E
           (QATTEMPT (QMATCHQ $S (TUPLE IDENTITY))
               THEN (TUPLE ALL BUT THE $$E)
             ELSE (QATTEMPT (QMATCHQ $S DOUBLEFN)
                      THEN (AND (QMATCHQ (TUPLE ←←ANY
                                                ELEMENT)
                                         $E)
                                (TUPLE ALL BUT THE $$ANY TWO ELEMENTS))
                    ELSE (AND (PRINT (QUOTE (SORRY BUT I CANNOT HANDLE 
                                                   SCHEMA $S YET)))
                              (QFAIL])

(STORECVALUE
  [QLAMBDA ←LOC
           (QPROG (←VALU
                    ←RESERVE)
                  (QATTEMPT (QEXISTS (TUPLE C $LOC ←VALU))
                      THEN (QATTEMPT (QBEXISTS
                                       (TUPLE C ←RESERVE
                                              $VALU)
                                         THEN
                                          (QIF (QEQUAL $RESERVE $LOC)
                                              THEN (QFAIL)
                                            ELSE (QPUT (TUPLE C 
                                                           $RESERVE 
                                                              $VALU)
                                                       NEEDED TRUE)))
                             ELSE (NEWCELL (TUPLE $VALU $LOC)))
                    ELSE (QRETURN TRUE])

(CONSC
  [QLAMBDA
    (TUPLE LIST ←L
           (TUPLE ←CAR
                  ←←CDR))
    (QPROG
      (←M
        ←S1
        ←S2)
      (QATTEMPT (QGOAL (TUPLE LIST $L $CDR)
                       APPLY $GOALTYPE)
          THEN (QATTEMPT
                 (QEXISTS (TUPLE LIST ←M
                                 (TUPLE ←←S1
                                        $CAR ←←S2)))
                   THEN [QPROG (←M2
                                 ←T)
                               (QMATCHQ ←T
                                        (GETNEWLOCNAME))
                               (QDELETE (TUPLE LIST $L $CDR))
                               (QMATCHQ ←M2
                                        (TUPLE $T $$CDR))
                               (QASSERT (TUPLE LIST $L $M2))
                               (QMATCHQ ←PGM
                                        (TUPLE (TUPLE COMMENT WE JUST 
                                                      TOOK THE NEW CELL 
                                                      $T
                                                        AND CONSED IT 
                                                            ONTO $L 
                                                            SINCE $CAR 
                                                            ALREADY 
                                                            BELONGS
                                                  TO ANOTHER LIST 
                                                     STRUCTURE NAMELY 
                                                     $M)
                                               (TUPLE SETQ $T $CAR)
                                               (TUPLE SETQ L
                                                      (TUPLE CONS $T $L)
                                                      )
                                               $$PGM))
                               (QATTEMPT (QEXISTS (TUPLE C $CAR ←M2))
                                   THEN (QASSERT (TUPLE C $T $M2]
                 ELSE (QPROG (←TEMP)
                             (QDELETE (TUPLE LIST $L $CDR))
                             (QMATCHQ ←TEMP
                                      (TUPLE $CAR $$CDR))
                             (QASSERT (TUPLE LIST $L $TEMP))
                             (QATTEMPT
                               (QEXISTS (TUPLE LIST $CAR ←←ANYTHING))
                                 THEN (APPENDC (TUPLE $CAR $L))
                               ELSE (QMATCHQ
                                      ←PGM
                                      (TUPLE (TUPLE COMMENT WE JUST 
                                                    TOOK $CAR
                                                      AND CONSED IT 
                                                          ONTO LIST $L)
                                             (TUPLE SETQ $L
                                                    (TUPLE CONS $CAR $L)
                                                    )
                                             $$PGM])

(SETQC
  [QLAMBDA (TUPLE C ←NEWLOC
                  ←NEWVAL)
           (QPROG (←OLDLOC
                    ←LOC2
                    ←V)
                  [QATTEMPT (QEXISTS (TUPLE C ←OLDLOC
                                            $NEWVAL))
                    ELSE (QPROG NIL
                                (QMATCHQ (TUPLE ←←A
                                                (TUPLE COMMENT ←VOLD
                                                       NO LONGER HAS 
                                                       THE VALUE 
                                                       $NEWVAL)
                                                (TUPLE ←←B)
                                                (TUPLE ←←C)←←D)
                                         $PGM)
                                (QMATCHQ (CLASS ←OLDLOC
                                                ←←UNUSEDVARS)
                                         $UNUSEDVARS)
                                (QASSERT (TUPLE C $OLDLOC $NEWVAL))
                                (QMATCHQ ←PGM
                                         (TUPLE $$A
                                                (TUPLE COMMENT $VOLD NO 
                                                       LONGER HAS THE 
                                                       VALUE $NEWVAL 
                                                       BUT SINCE WE 
                                                       WILL BE NEEDING 
                                                       IT LATER WE 
                                                       STORED $NEWVAL
                                                   IN THE NEW 
                                                      AUXILLIARY CELL 
                                                      $OLDLOC)
                                                (TUPLE $$B)
                                                (TUPLE $$C)
                                                (TUPLE SETQ $OLDLOC 
                                                       $VOLD)
                                                $$D]
                  (QATTEMPT (QEXISTS (TUPLE C ←LOC2
                                            $NEWVAL)
                                     NEEDED TRUE)
                    ELSE (QPUT (TUPLE C $OLDLOC $NEWVAL)
                               NEEDED TRUE))
                  (BUILDPGM (TUPLE $NEWLOC $NEWVAL $OLDLOC))
                  (QDELETE (TUPLE C $NEWLOC ←V))
                  (QASSERT (TUPLE C $NEWLOC $NEWVAL])

(TRANSITIVECLOSURE
  [QLAMBDA (TUPLE ←RELN
                  ←A
                  ←B)
           (QIF (QEQUAL (QGET (TUPLE $RELN TRANSITIVE))
                        TRUE)
             ELSE (QFAIL))
           (QBEXISTS (TUPLE $RELN $A ←ANY)
               THEN (QIF (QEQUAL $ANY $B)
                        THEN (QASSERT (TUPLE $RELN $A $B))
                      ELSE (TRANSITIVECLOSURE (TUPLE $RELN $ANY $B])

(TRYANYTHINGANTISYMPARTIAL
  (QLAMBDA (TUPLE ←TYPE
                  ←←STUFF
                  (TUPLE ←RELN
                         ←A
                         ←B)←←STUFF2)
           (QIF (QAND (QGET $RELN ANTISYM)
                      (QGET $RELN PARTIAL))
             ELSE (QFAIL))
           (QIF (QOR (QATTEMPT (QEXISTS (TUPLE $RELN $A $B))
                         THEN (QNOTEQUAL (QGET (TUPLE $RELN $A $B)
                                               TEMP)
                                         TRUE))
                     (QATTEMPT (QEXISTS (TUPLE $RELN $B $A))
                         THEN (QNOTEQUAL (QGET (TUPLE $RELN $B $A)
                                               TEMP)
                                         TRUE)))
               THEN (QFAIL))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT IF $A $RELN $B
                                             THEN)
                           (TUPLE COND (TUPLE $RELN $A $B))
                           $$PGM))
           (QASSERT (TUPLE $RELN $A $B))
           (QPUT (TUPLE $RELN $A $B)
                 TEMP TRUE)
           (QATTEMPT (QGOAL (TUPLE $TYPE $$STUFF (TUPLE $RELN $A $B)
                                   $$STUFF2)
                            APPLY $GOALTYPE)
             ELSE (QMATCHQ ←PGM
                           (TUPLE (TUPLE PRINT GIVEUP)
                                  $$PGM)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT END OF THE
                               THEN PART OF THE COND
                                      AND THUS BEGIN THE
                             ELSE PART OF THE COND)
                           (TUPLE (TUPLE T))
                           $$PGM))
           (QDELETE (TUPLE $RELN $A $B))
           (QASSERT (TUPLE $RELN $B $A))
           (QPUT (TUPLE $RELN $B $A)
                 TEMP TRUE)
           (QATTEMPT (QGOAL (TUPLE $TYPE $$STUFF (TUPLE $RELN $A $B)
                                   $$STUFF2)
                            APPLY $GOALTYPE)
             ELSE (QMATCHQ ←PGM
                           (TUPLE (TUPLE PRINT GIVEUP)
                                  $$PGM)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT END OF COND EXPRESSION)
                           $$PGM))
           (QDELETE (TUPLE $RELN $B $A))
           BACKTRACK))

(SIMPLEGOAL
  [QLAMBDA ←ANYTHING
           (QGOAL $ANYTHING APPLY $LITTLEGUYS)
           (COND
             (REQUIRE (QPUT $ANYTHING REQUIRED TRUE])

(SOLVE
  (QLAMBDA ←PROBLEM
           (QGOAL $PROBLEM APPLY $GOALTYPE)
           (QMATCHQ ←PGM
                    (QREVERSE $PGM))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT BEGINNING OF PROGRAM)
                           $$PGM
                           (TUPLE COMMENT END OF PROGRAM)))
           (PRINT (OUTTUPLE (CDR $PGM)))
           (PRINT (QUOTE "
  
     LISP CODE ONLY"))
           (PRINT (QUOTE "


"))
           (PURE $PGM)
           (TUPLE END OF THIS REQUEST)))

(SETUP
  (QLAMBDA ←ANYTHING
           (DENYALL)
           (UNQTRACE PURE)
           (QASSERT (TUPLE RELN SUCC)
                    TYPE POSITIONAL EXTREME (TUPLE LAST ELEMENT)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYELEMENT NOT LAST 
                                                ELEMENT))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT
                                          FIRST ELEMENT)))
           (QASSERT (TUPLE RELN PRED)
                    TYPE POSITIONAL EXTREME (TUPLE FIRST ELEMENT)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYELEMENT NOT
                                            FIRST ELEMENT))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT LAST 
                                              ELEMENT)))
           (QASSERT (TUPLE RELN ENCLOSE)
                    TYPE ORDERING EXTREME
                    (TUPLE SINGLETON LIST OF THE FIRST ELEMENT)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYELEMENT NOT))
                    NRES 1 TRES (TUPLE (TUPLE ANYLIST NOT ATOM)))
           (QASSERT (TUPLE RELN NUMERORDER)
                    TYPE ORDERING EXTREME (TUPLE SMALLEST ELEMENT)
                    NARGS 2 TARGS (TUPLE (TUPLE ANYELEMENT NOT)
                                         (TUPLE ANYELEMENT NOT))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT)))
           (QASSERT (TUPLE RELN ALPHORDER)
                    TYPE ORDERING EXTREME (TUPLE CLOSEST ELEMENT
                                             TO A)
                    NARGS 2 TARGS (TUPLE (TUPLE ANYELEMENT NOT)
                                         (TUPLE ANYELEMENT NOT))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT)))
           (QASSERT (TUPLE SCHEMA DOUBLEFN)
                    STANDARD T EXTREME (TUPLE SAMEASFN)
                    NARGS 1 TARGS
                    [TUPLE (TUPLE RELN NARGS 1 NRES 1
                                  (EQUAL (CADADR TARGS)
                                         (CADADR TRES]
                    NRES 1 TRES (TUPLE (TUPLE SAMEASFN NOT)))
           (QASSERT (TUPLE RELN CAR)
                    TYPE DESTRUCTIVE EXTREME (TUPLE LEFTMOST ATOM)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYLIST NOT NIL))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT)))
           (QASSERT (TUPLE RELN CDR)
                    TYPE DESTRUCTIVE EXTREME (TUPLE NIL)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYLIST NOT NIL))
                    NRES 1 TRES (TUPLE (TUPLE ANYLIST NOT ATOM)))
           (QASSERT (TUPLE RELN CONS)
                    TYPE CONSTRUCTIVE EXTREME (TUPLE ANYLIST)
                    NARGS 2 TARGS (TUPLE (TUPLE ANYELEMENT NOT)
                                         (TUPLE ANYLIST NOT ATOM))
                    NRES 1 TRES (TUPLE (TUPLE ANYLIST NOT)))
           (QASSERT (TUPLE RELN APPEND)
                    TYPE CONSTRUCTIVE EXTREME (TUPLE ANYLIST)
                    NARGS 2 TARGS (TUPLE (TUPLE ANYLIST NOT ATOM)
                                         (TUPLE ANYLIST NOT ATOM))
                    NRES 1 TRES (TUPLE (TUPLE ANYLIST NOT)))
           (QASSERT (TUPLE C A A3))
           (QASSERT (TUPLE C B B3))
           (QASSERT (TUPLE C C C3))
           (QASSERT (TUPLE C D D3))
           (QASSERT (TUPLE C E E3))
           (QASSERT (TUPLE C F F3))
           (QASSERT (TUPLE C G G3))
           (QASSERT (TUPLE C I I3))
           (QASSERT (TUPLE C J J3))
           (QASSERT (TUPLE C K K3))
           (QASSERT (TUPLE C H H3))
           (QASSERT (TUPLE LIST L1 (TUPLE)))
           (QASSERT (TUPLE LIST L2 (TUPLE)))
           (QASSERT (TUPLE LIST L3 (TUPLE)))
           (QASSERT (TUPLE LIST L4 (TUPLE A B C)))
           (QASSERT (TUPLE LIST L5 (TUPLE D E)))
           (QASSERT (TUPLE LESS I J))
           (QASSERT (TUPLE LESS J K))
           (QASSERT (TUPLE LESS H I))
           (QPUT LESS ANTISYM T)
           (QPUT LESS PARTIAL T)
           (QPUT LESS TRANSITIVE T)
           (TUPLE SETUP COMPLETED)))

(INIT
  (QLAMBDA ←ANYTHING
           (QMATCHQ ←GOALTYPE
                    (TUPLE ORGOAL ANDGOAL XORGOAL SERIESGOAL SIMPLEGOAL 
                           TRYANYTHINGANTISYMPARTIAL))
           (QMATCHQ ←LITTLEGUYS
                    (TUPLE SETQC RPLAC CONSC MAKENULL TRANSITIVECLOSURE 
                           REV2ELS RECURLIST))
           (QMATCHQ ←PGM
                    (TUPLE))
           (QMATCHQ ←UNUSEDVARS
                    (CLASS U1 U2 U3 U4 U5 U6 U7 U8 U9 U10 U11 U12 U13 
                           U14 U15 U16 U17))
           (QMATCHQ ←UNUSEDV
                    $UNUSEDVARS)
           $ANYTHING
           (QMATCHQ ←UNUSEDFNS
                    (CLASS F1 F2 F3 F4 F5 F6 F7 F8 F9 F10))))

(GETNEWLOCNAME
  (QLAMBDA ←ANYTHING
           (QPROG (←X)
                  (QMATCHQ (CLASS ←X
                                  ←←UNUSEDVARS)
                           $UNUSEDVARS)
                  (QRETURN $X))))

(DENYALL
  [QLAMBDA ←ANYTHING
           (QATTEMPT (QDELETE (TUPLE C ←C1
                                     ←V1)))
           [QATTEMPT (QDELETE (TUPLE LIST ←L1
                                     (TUPLE ←←V1]
           (QATTEMPT (QDELETE (TUPLE LESS ←C1
                                     ←V1])

(SERIESGOAL
  (QLAMBDA (TUPLE SERIES ←Z1
                  ←←Z2)
           (SETQ NEED NIL)
           (SETQ REQUIRE NIL)
           (QGOAL $Z1 APPLY $GOALTYPE)
           (QIF (QEQUAL $Z2 (TUPLE))
               THEN $PGM
             ELSE (QGOAL (TUPLE SERIES $$Z2)
                         APPLY $GOALTYPE))))

(ORGOAL
  (QLAMBDA (CLASS OR ←Z1
                     ←←Z2)
           (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
               THEN (QMATCHQ ←PGM
                             (TUPLE (TUPLE COMMENT
                                       FROM THE ORTASK WE SHALL
                                       DO $Z1)
                                    $$PGM))
             ELSE (QGOAL (CLASS OR $$Z2)
                         APPLY $GOALTYPE))))

(ANDGOAL
  [QLAMBDA (CLASS AND ←←Z)
           (QPROG (←Z1
                    ←Z2
                    ←Z3)
                  (QMATCHQ ←Z3
                           (CLASS))
                  (QMATCHQ (CLASS ←Z1
                                  ←←Z2)
                           $Z)
                  (GO B2)
                  B1
                  (QMATCHQ (CLASS ←Z1
                                  ←←Z2)
                           $Z)
                  (QMATCHQ ←Z3
                           (CLASS $$Z3 $Z1))
                  (QMATCHQ ←Z
                           (CLASS $$Z2))
                  B2
                  (SETQ NEED T)
                  (SETQ REQUIRE T)
                  (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
                      THEN (QIF (QEQUAL $Z2 (CLASS))
                               THEN (QIF (QEQUAL $Z3 (CLASS))
                                        THEN $PGM
                                      ELSE (QGOAL (CLASS AND $$Z3)
                                                  APPLY $GOALTYPE))
                             ELSE (QGOAL (CLASS AND $$Z2)
                                         APPLY $GOALTYPE))
                    ELSE (GO B1])

(XORGOAL
  (QLAMBDA (CLASS XOR ←Z1
                  ←←Z2)
           (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
               THEN (QATTEMPT (QGOAL (CLASS NONEOF $$Z2)
                                     APPLY $GOALTYPE)
                        THEN (QMATCHQ ←PGM
                                      (TUPLE (TUPLE COMMENT OF THE 
                                                    EXCLUSIVE
                                                      OR GOAL WE DID 
                                                         $Z1
                                                      AND NO OTHERS ARE 
                                                          SATISFIED)
                                             $$PGM)))
             ELSE (QGOAL (CLASS XOR $$Z2)
                         APPLY $GOALTYPE))))

(BUILDPGM
  [QLAMBDA (TUPLE ←NEWLOC
                  ←NEWVAL
                  ←OLDLOC)
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT I JUST TRANSFERRED THE VALUE 
                                  $NEWVAL
                              FROM CELL $OLDLOC
                              TO CELL $NEWLOC)
                           (TUPLE SETQ $NEWLOC $OLDLOC)
                           $$PGM))
           (QATTEMPT (QEXISTS (TUPLE C $NEWLOC ←OV))
               THEN (QMATCHQ ←PGM
                             (TUPLE (TUPLE COMMENT $NEWLOC NO LONGER 
                                           HAS THE VALUE $OV)
                                    $$PGM])

(GOBYEXAMPLE
  (QLAMBDA ←BODY
           (SETQ EX (GETEXAMPLE))
           [SETQ BOD (NEWCARCDR (OUTTUPLE (CDR $BODY]
           (ERRORSET (EXECUTE BOD))
           (SETQ XX (CONS (QUOTE TUPLE)
                          EX))
           (QMATCHQ ←XX
                    (EVAL XX))
           (ASKABOUTALL (CLASS $X))))

(GETEXAMPLE
  [LAMBDA NIL
    (QUOTE (A B C])

(SAMEASFN
  [LAMBDA (A)
    A])

(DOUBLEFN
  (QLAMBDA (TUPLE ←OLDARG
                  ←REL)
           (TUPLE $REL (TUPLE $REL $$OLDARG))))

(SYNTH1
  (QLAMBDA ←A
           (SELECTQ (CADR $A)
                    (NIL (TUPLE NULL $L))
                    (ATOM (TUPLE ATOM $L))
                    (FIRST (TUPLE NULL (TUPLE CDR $L)))
                    (LAST (TUPLE NULL (TUPLE CDR $L)))
                    (TUPLE EQUAL $L $$A))))

(SYNTH2
  (QLAMBDA (TUPLE ←A
                  ←B)
           (COND
             ((NULL (CADR $B))
               $B)
             ((EQUAL (CADR $B)
                     T)
               $B)
             ((NUMBERP (CADR $B))
               $B)
             ((EQUAL $A $B)
               (TUPLE $L))
             ((EQUAL (LIST $A)
                     $B)
               (TUPLE LIST $L))
             ((EQUAL (CADR $B)
                     (QUOTE FIRST))
               (TUPLE (TUPLE CAR $L)))
             (T (PRINT (QUOTE (I AM UNSURE ABOUT THE SYNTHESIS OF $B)))
                $B))))

(ASKABOUT
  [QLAMBDA
    ←A
    (SELECTQ
      (LENGTH (CDR $A))
      (0 (PRINT (QUOTE (APPARENTLY NO FURTHER BASE STEP IS NEEDED
                          FOR SYNTACTIC REASONS)))
         (IF (AND (QIN $NAME $BODY)
                  (NULL ONESTEP))
             THEN (QAND (PRINT (QUOTE (BUT $NAME APPEARS
                                         IN THE BODY OF THE DESIRED 
                                            FUNCTION $NAME)))
                        (PRINT (QUOTE (THUS I GIVE UP)))
                        (QFAIL)))
         [IF (NULL ONESTEP)
             THEN (PRINT (QUOTE (IT APPEARS THAT THE DEFINITION IS NOT 
                                    TRULY RECURSIVE
                                      AND THUS I SHALL PROCEED]
         $BODY)
      (AND [PRINT (APPEND (QUOTE (IF THE INPUT IS))
                          (CDR $A)
                          (QUOTE (THEN WHAT IS THE OUTPUT??]
           (SETQ ONESTEP T)
           (QMATCHQ ←TERM
                    (TUPLE [QCONS (SYNTH1 $A)
                                  (SYNTH2
                                    (TUPLE $A (TUPLE (CONS (RATOM)
                                                           (READLINE]
                           $$TERM])

(RHMATCH
  (QLAMBDA (TUPLE ←←A
                  (TUPLE ←←B
                         NOT ←←C)←←D)
           (TUPLE $A $B $C $D)
           BACKTRACK))

(RECHEAD
  [QLAMBDA ←BODY
           (QPROG (←A
                    ←B
                    ←C
                    ←D
                    ←F)
                  (QMATCHQ (TUPLE ←IMP
                                  ←←REST)
                           $BODY)
                  (QMATCHQ ←FF
                           (CLASS))
                  (SETQ ONESTEP NIL)
                  (QMATCHQ ←TERM
                           (TUPLE))
                  (QMATCHQ ←B2
                           (QGET (TUPLE RELN $IMP)
                                 TARGS))
                  LOOP
                  (QATTEMPT (QMATCHQ (TUPLE ←A
                                            ←B
                                            ←C
                                            ←D)
                                     (RHMATCH $B2))
                      THEN (AND (COND
                                  ((EQUAL (LENGTH $A)
                                          1)
                                    (QMATCHQ (TUPLE ←A1
                                                    (TUPLE ←A2
                                                           ←F
                                                           ←←A4)←←A5)
                                             $BODY))
                                  ((EQUAL (LENGTH $A)
                                          2)
                                    (QMATCHQ (TUPLE ←A1
                                                    ←A6
                                                    (TUPLE ←A2
                                                           ←F
                                                           ←←A4)←←A5)
                                             $BODY))
                                  (T (PRINT (QUOTE (LENGTH OF LIST NOT 
                                                           ZERO
                                                             OR ONE
                                                      AS EXPECTED)))
                                     (PRINT (CDR (TUPLE $A $F $BODY)))
                                     (QFAIL)))
                                (QMATCHQ ←FF
                                         (CLASS $C $$FF))
                                (QMATCHQ ←B2
                                         (TUPLE $$A $$D))
                                (GO LOOP))
                    ELSE (TUPLE DEFINEQ
                                (TUPLE $NAME
                                       (TUPLE LAMBDA (TUPLE $L)
                                              (QATTEMPT (ASKABOUTALL
                                                          $FF)
                                                  THEN $AALH
                                                ELSE (GOBYEXAMPLE
                                                       $BODY])

(EXTREMEPOSITION
  (QLAMBDA ←RELATION
           (QGET (TUPLE RELN $RELATION)
                 EXTREME)))

(EXTREMERELATIVEPOSITION
  [QLAMBDA (TUPLE ←REL
                  ←NEWARG
                  ←OLDARG)
           (QATTEMPT (QMATCHQ $NEWARG $OLDARG)
               THEN (EXTREMEPOSITION $REL)
             ELSE (AND (QMATCHQ ←TTEMP
                                (INVOLVES $NEWARG $OLDARG))
                       (QBEXISTS (TUPLE SCHEMA ←S)
                                 STANDARD $TTEMP
                           THEN (QMATCHQ (TUPLE $REL $$OLDARG)
                                         ($S (TUPLE $NEWARG $REL)))
                                (APPLY* (CADR (QGET (TUPLE SCHEMA $S)
                                                    EXTREME))
                                        (EXTREMEPOSITION $REL])

(POSITIONALJOIN
  [QLAMBDA (TUPLE ←E2
                  ←ABE2
                  ←E1)
           (QMATCHQ ←E2T
                    (LISPTRANSLATE $E2))
           (QMATCHQ ←ABE2T
                    (LISPTRANSLATE $ABE2))
           (QATTEMPT (QMATCHQ $E1 (TUPLE FIRST ELEMENT))
               THEN (TUPLE CONS $E2T (TUPLE $NAME $ABE2T))
             ELSE (QATTEMPT (QMATCHQ $E1 (TUPLE LAST ELEMENT))
                      THEN (TUPLE APPEND (TUPLE $NAME $ABE2T)
                                  (TUPLE LIST $E2T))
                    ELSE (EVAL (PRINT (QUOTE (QFAIL])

(POSITIONAL
  (QLAMBDA ←L
           (QMATCHQ ←S
                    (TUPLE IDENTITY))
           (QMATCHQ ←E1
                    (EXTREMEPOSITION $RELNN))
           (QMATCHQ ←E2
                    (EXTREMERELATIVEPOSITION (TUPLE $RELNO $ARGSN 
                                                    $ARGSO)))
           (QMATCHQ ←PGM
                    (TUPLE (PRINT (TUPLE COMMENT
                                     IN PARTICULAR THE $$E1 OF THE NEW 
                                        LIST IS THE $$E2 OF THE
                                     OLD LIST $L))
                           $$PGM))
           (QMATCHQ ←RECBODY
                    (POSITIONALJOIN (TUPLE $E2 (ALLBUT $E2)
                                           $E1)))
           (PRINT (QUOTE (THIS ENABLED US TO GET THE RECURSIVE BODY)))
           (PRINT $RECBODY)
           (PRINT (QUOTE (WE NOW DETERMINE THE TERMINATION STEPS)))
           (QMATCHQ ←NEWFUNC
                    (RECHEAD $RECBODY))
           [EVAL (PRINT (OUTTUPLE (CDR $NEWFUNC]
           (QMATCHQ ←PGM
                    (TUPLE $NEWFUNC $$PGM))))

(RECURLIST
  [QLAMBDA
    (TUPLE LIST ←L)
    (QMATCHQ (CLASS ←NAME
                    ←←UNUSEDFNS)
             $UNUSEDFNS)
    (QMATCHQ ←PGM
             (TUPLE (TUPLE COMMENT I AM ABOUT
                       TO CONSTRUCT A POSSIBLY RECURSIVE NEW FUNCTION 
                          WHICH I CHOOSE
                       TO CALL $NAME AND WHICH WILL TRANSFORM LISTS)
                    $$PGM))
    (PRINT (OUTTUPLE (TUPLE I AM ABOUT TO CONSTRUCT A POSSIBLY 
                                          RECURSIVE FUNCTION
                        TO TRANSFORM LISTS)))
    [PRINT (APPEND (QUOTE (THE NAME I CHOOSE FOR THIS FUNCTION IS))
                   (CDR (TUPLE $NAME]
    [PRINT (APPEND (QUOTE (THUS I NEED MORE INFORMATION ABOUT THE
                             OLD VERSUS THE NEW STRUCTURE OF LIST))
                   (CDR (TUPLE $L]
    (PRIN1 (QUOTE "OLD.... "))
    (/SETQ OLDLIST (CONS (RATOM)
                         (READLINE)))
    (SETQ TEMPO (CONS (QUOTE TUPLE)
                      OLDLIST))
    (QMATCHQ (TUPLE ←RELNO
                    ←←ARGSO)
             (EVAL TEMPO))
    (PRIN1 (QUOTE "NEW.... "))
    (/SETQ NEWLIST (CONS (RATOM)
                         (READLINE)))
    (SETQ TEMPO (CONS (QUOTE TUPLE)
                      NEWLIST))
    (QMATCHQ (TUPLE ←RELNN
                    ←←ARGSN)
             (EVAL TEMPO))
    (QMATCHQ ←RELNTYPE
             (QGET (TUPLE RELN $RELNN)
                   TYPE))
    (QATTEMPT (OR (QMATCHQ $ARGSO (TUPLE))
                  (QMATCHQ $RELNTYPE (QGET (TUPLE RELN $RELNO)
                                           TYPE)))
        THEN (QAND (QMATCHQ ←PGM
                            (TUPLE (PRINT (TUPLE COMMENT WE KNOW THAT 
                                                 THE INITIAL
                                             TO FINAL TRANSFORMATION 
                                                INVOLVES SOLELY 
                                                $RELNTYPE CHANGES))
                                   $$PGM))
                   ($RELNTYPE $L)
                   (QMATCHQ ←PGM
                            (TUPLE (TUPLE $NAME $L)
                                   (TUPLE COMMENT WE APPLY OUR NEW 
                                          FUNCTION $NAME
                                      TO OUR GIVEN ARBITRARY LIST $L)
                                   $$PGM)))
      ELSE (QAND (QMATCHQ ←PGM
                          (TUPLE (PRINT (TUPLE COMMENT WE KNOW THAT THE 
                                               INITIAL
                                           TO FINAL CHANGE INVOLVES A 
                                              MIXTURE OF BOTH $RELNTYPE
                                                AND
                                                 (QGET (TUPLE RELN 
                                                             $RELNO)
                                                       TYPE)
                                                 CHANGES))
                                 $$PGM])
)
  (QSETUP PUPVARS)
  (SETUP)
  (INIT)
  (PRINT (QUOTE (READY TO BEGIN PUP)))
STOP